#include "useradddialog.h"
#include "ui_useradddialog.h"
#include <QSqlQuery>
#include <QMessageBox>
#include "logic.h"

UserAddDialog::UserAddDialog(QWidget *parent, int id, const QString &name, int permissions, bool chgPasswd) :
        QDialog(parent),
        m_ui(new Ui::UserAddDialog), id(id), chgPasswd(chgPasswd), name(name)
{
    m_ui->setupUi(this);
    m_ui->cbPermissions->addItem("Администратор", 777);
    m_ui->cbPermissions->addItem("Оператор", 77);
    m_ui->cbPermissions->addItem("Аудитор", 7);

    //не разрешаем изменять имя пользователя в этой форме!!!


    if (id != -1) {
        m_ui->leUser->setText(name);
        m_ui->leUser->setDisabled(true);

        m_ui->cbPermissions->setCurrentIndex(m_ui->cbPermissions->findData(permissions));
        if (!chgPasswd) {
            m_ui->lePasswd->setText("********");
            m_ui->lePasswdAgain->setText("********");
            m_ui->lePasswd->setDisabled(true);
            m_ui->lePasswdAgain->setDisabled(true);
            setWindowTitle(tr("Измение прав доступа пользователя"));
        }
        else {
            m_ui->cbPermissions->setDisabled(true);
            setWindowTitle(tr("Изменение пароля пользователя"));
        }
    }
    else {
        setWindowTitle(tr("Добавление нового пользователя"));
    }

}


UserAddDialog::~UserAddDialog()
{
    delete m_ui;
}

void UserAddDialog::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        m_ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

bool UserAddDialog::addUserIntoDb()
{
    QSqlQuery query;
    query.prepare(QString("INSERT INTO users (name, permission, passwd) VALUES "
                          "(\"%1\", %2, \"%3\")")
                  .arg(m_ui->leUser->text())
                  .arg(m_ui->cbPermissions->itemData(m_ui->cbPermissions->currentIndex()).toInt())
                  .arg(logic::hashPasswd(m_ui->lePasswd->text())));
    if(!query.exec()) {
        QMessageBox::warning(this, tr("Ошибка при  добавлении нового пользователя"),
                             tr("Невозможно добавить пользователя!\nSql error: ") + query.lastError().text(),
                             QMessageBox::Ok, QMessageBox::Ok);
        return 0;
    }
    return 1;
}


void UserAddDialog::accept()
{
    bool updated = false;
    if (checkDataFullness() ) {
        if (id == -1)
            updated = addUserIntoDb();
        else {
            if (chgPasswd)
                 updated = changeUserPassword();
            else
                 updated = changeUserPermissions();
        }
    }
    if (updated) {
        hide();
        setResult(QDialog::Accepted);
    }
}

bool UserAddDialog::checkDataFullness()
{
    if (m_ui->leUser->text().isEmpty() ||
        m_ui->cbPermissions->currentIndex() == -1 ||
        m_ui->lePasswd->text().isEmpty() )
    {
        QMessageBox::warning(this, tr("Некорректное заполнения формы"),
                             tr("Незаполнено одно или несколько из обязательных полей формы!"),
                             QMessageBox::Ok, QMessageBox::Ok );
        return false;
    }
    else {
        if (m_ui->lePasswd->text() != m_ui->lePasswdAgain->text() ) {
            QMessageBox::warning(this, tr("Некорректное заполнение формы."),
                                 tr("Несовпадение паролей!"),
                                 QMessageBox::Ok, QMessageBox::Ok);
            return false;
        }
        return true;
    }
}

bool UserAddDialog::changeUserPermissions()
{
    QSqlQuery query;
    query.prepare(QString("UPDATE users SET permission = %1 WHERE id = %2")
                  .arg(m_ui->cbPermissions->itemData(m_ui->cbPermissions->currentIndex()).toInt())
                  .arg(id) );
    if(!query.exec()) {
        QMessageBox::warning(this, tr("Ошибка при изменении прав пользователя <b>%1<\b>").arg(name),
                             tr("Невозможно добавить пользователя!\nSql error: ") + query.lastError().text(),
                             QMessageBox::Ok, QMessageBox::Ok);
        return 0;
    }
    return 1;
}

bool UserAddDialog::changeUserPassword()
{
    QSqlQuery query;
    QString str = QString("UPDATE users SET passwd = \"%1\" WHERE id = %2")
                  .arg(logic::hashPasswd(m_ui->lePasswd->text()))
                  .arg(id);
    query.prepare(str);
    m_ui->lePasswd->setText("");
    m_ui->lePasswdAgain->setText("");
    if(!query.exec()) {
        QMessageBox::warning(this, tr("Ошибка при изменении пароль пользователя <b>%1<\b>").arg(name),
                             tr("Невозможно добавить пользователя!\nSql error: ") + query.lastError().text() +"\n" + query.lastError().text(),
                             QMessageBox::Ok, QMessageBox::Ok);
        return 0;
    }
    return 1;
}

